import axios from 'axios'
import { ElMessage } from "element-plus"
import router from "@/router"

// 常量定义
export const apiUrl = "/tp"
export const imgUrl = "http://localhost:7188/"

// 创建axios实例
const instance = axios.create({
    baseURL: apiUrl,
    timeout: 6000,
    headers: {
        "Content-Type": "application/x-www-form-urlencoded"
    }
})

// 请求拦截器
instance.interceptors.request.use(
    (config) => {
        // 动态获取token，避免使用过期的token
        const token = localStorage.getItem("token")
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }

        // 特殊处理/admin路由的请求
        if (config.url?.startsWith('/admin')) {
            if (!token) {
                // 如果请求/admin接口但没有token，直接跳转到/admin/login
                router.push('/admin/login')
                return Promise.reject(new Error('未授权，请先登录'))
            }
        }

        return config
    },
    (error) => {
        return Promise.reject(error)
    }
)

// 响应拦截器
instance.interceptors.response.use(
    (response) => {
        // 处理成功响应
        /*if (response.data?.code === 200) {
            response.data.message && ElMessage.success(response.data.message)
            return response.data
        } else {
            response.data?.message && ElMessage.error(response.data.message)
            return Promise.reject(response.data)
        }*/
        return response.data
    },
    (error) => {
        // 处理错误响应
        if (error.code === 'ECONNABORTED' || error.message?.includes('timeout')) {
            ElMessage.error('请求超时啦~')
            return Promise.reject({ message: '请求超时' })
        }

        // 统一处理HTTP错误状态码
        const errorMap = {
            400: '请求参数错误',
            401: '未授权，请重新登录',
            402: '请求异常',
            403: '拒绝访问',
            404: '请求资源不存在',
            405: '请求方法不允许',
            408: '请求超时',
            500: '服务器内部错误',
            501: '服务未实现',
            502: '网关错误',
            503: '服务不可用',
            504: '网关超时',
            505: 'HTTP版本不受支持'
        }

        const status = error.response?.status
        const message = errorMap[status] || `请求错误: ${status}`
        const requestUrl = error.config?.url || ''

        if(status === 500){
            router.push({
                path: '/error',
                query: {
                    errorType: '500',
                    errorCode: '500'
                }
            })
        }

        // 特殊处理/admin路由的错误
        if (status === 401 || status === 403) {
            ElMessage.error(message)

            // 判断是否是/admin路由
            if (requestUrl.startsWith('/admin') ||
                router.currentRoute.value?.path.startsWith('/admin')) {
                // 避免重复跳转
                if (!router.currentRoute.value?.path.startsWith('/admin/login')) {
                    router.push('/admin/login')
                }
            } else {
                router.push('/')
            }
        } else if (status) {
            ElMessage.error(message)
        }

        return Promise.reject({
            status,
            message,
            data: error.response?.data,
            isAdminRequest: requestUrl.startsWith('/admin')
        })
    }
)

export default instance
